import { getToken, setToken, removeToken, setTime } from '@/utils/auth'
import { logoApi, getUserInfoApi, userInFormationApi } from '@/api'
import { resetRouter } from '@/router' // 引入清除路由的方法

const state = {
  // 设置共享token
  token: getToken(), // 获取本地存储的token
  userInfo: {} // 不能写null 否则getters快捷访问调取会报错
}
const mutations = {
  SET_TOKEN(state, token) {
    state.token = token // 设置vuex中的token
    setToken(token) // 设置本地存储的token
    // console.log(getToken())
  },
  REMOVE_TOKEN(state) {
    state.token = null // 删除vuex中token值
    removeToken()
  },

  // 个人信息
  SET_USERINFO(state, result) {
    state.userInfo = result // 同步更新
    // state.userInfo = {...result} // 也行， 浅拷贝写法
  },
  REMOVE_USERINFO(state) {
    state.userInfo = {}
  }
}

const actions = {
  // 登录请求
  async logo(state, data) {
    // axios外层套的data已经被响应拦截器解构掉
    const result = await logoApi(data)
    //  触发 mutations 中的setToken方法设置请求来的token
    state.commit('SET_TOKEN', result)
    // 登录存储token的同时存储本地时间戳
    setTime()
  },

  // 获取用户信息
  async userInfo(state) {
    // 获取用户基本资料
    const result = await getUserInfoApi()
    // 获取员工基本资料
    const userFormation = await userInFormationApi(result.userId)
    // 合并数组
    state.commit('SET_USERINFO', { ...result, ...userFormation })
    return result // 权限拦截时要使用用户信息中的路由标识 所以要返回出去
  },

  // 登出
  logout(state) {
    // 删除用户token
    state.commit('REMOVE_TOKEN')
    // 删除用户个人资料
    state.commit('REMOVE_USERINFO')
    // 删除动态路由信息
    resetRouter()
    // 删除本地用来循环左侧导航栏的路由信息
    state.commit('permission/SET_ROUTES', [], { root: true })
    // vuex子模块调用子模块的actions在没有加锁(命名空间)的情况可以随意调用
    // 不加命名空间的情况下，所有的 mutations actions 都是挂载全局上的 state 可直接调用
    // { root: true } 调用根级的 mutations actions
  }
}

export default {
  namespaced: true, // 开启命名空间
  state,
  mutations,
  actions
}

